<?php
defined('IN_CDO') or exit('illegal infiltration.');
/**
 *  模板解析缓存 by phpcms
 */
final class tpl_cache {

    /**
     * 编译模板
     *
     * @param $module	模块名称
     * @param $template	模板文件名
     * @param $istag	是否为标签模板
     * @return unknown
     */

    public function template_compile($module, $template,$fext="html") {
    	$tplfile = $_tpl = ROOT_PATH.$module.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$template.'.'.$fext;
        if (! file_exists ( $tplfile )) {
            exit($tplfile." is not exists!");
        }
        $content = @file_get_contents ( $tplfile );

        $filepath = CACHE_PATH.'caches_tpl'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR;
        if(!is_dir($filepath)) {
            mkdir($filepath, 0777, true);
        }
        $compiledtplfile = $filepath.$template.'.php';
        $content = $this->template_parse($content);
        $strlen = file_put_contents ( $compiledtplfile, $content );
        chmod ( $compiledtplfile, 0777 );
        return $strlen;
    }


    /**
     * 更新模板缓存
     *
     * @param $tplfile	模板原文件路径
     * @param $compiledtplfile	编译完成后，写入文件名
     * @return $strlen 长度
     */
    public function template_refresh($tplfile, $compiledtplfile) {
        $str = @file_get_contents ($tplfile);
        $str = $this->template_parse ($str);
        $strlen = file_put_contents ($compiledtplfile, $str );
        chmod ($compiledtplfile, 0777);
        return $strlen;
    }


    /**
     * 解析模板
     *
     * @param $str	模板内容
     * @return ture
     */
    public function template_parse($str) {
        $str = preg_replace ( "/\{template_auto\s+(.+)\}/", "<?php include template_auto(\\1); ?>", $str );
        $str = preg_replace ( "/\{include\s+(.+)\}/", "<?php include \\1; ?>", $str );
        $str = preg_replace ( "/\{php\s+(.+)\}/", "<?php \\1?>", $str );
        $str = preg_replace ( "/\{if\s+(.+?)\}/", "<?php if(\\1) { ?>", $str );
        $str = preg_replace ( "/\{else\}/", "<?php } else { ?>", $str );
        $str = preg_replace ( "/\{elseif\s+(.+?)\}/", "<?php } elseif (\\1) { ?>", $str );
        $str = preg_replace ( "/\{\/if\}/", "<?php } ?>", $str );
        //for 循环
        $str = preg_replace("/\{for\s+(.+?)\}/","<?php for(\\1) { ?>",$str);
        $str = preg_replace("/\{\/for\}/","<?php } ?>",$str);
        //++ --
        $str = preg_replace("/\{\+\+(.+?)\}/","<?php ++\\1; ?>",$str);
        $str = preg_replace("/\{\-\-(.+?)\}/","<?php ++\\1; ?>",$str);
        $str = preg_replace("/\{(.+?)\+\+\}/","<?php \\1++; ?>",$str);
        $str = preg_replace("/\{(.+?)\-\-\}/","<?php \\1--; ?>",$str);
        $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/", "<?php \$n=1;if(is_array(\\1)) foreach(\\1 AS \\2) { ?>", $str );
        $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", "<?php \$n=1; if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>", $str );
        $str = preg_replace ( "/\{\/loop\}/", "<?php \$n++;}unset(\$n); ?>", $str );
        $str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str );
        $str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "<?php echo \\1;?>", $str );
        $str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "<?php echo \\1;?>", $str );


        /*$str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "\$this->addquote('<?php echo \\1;?>')",$str);*/
        $str = preg_replace_callback("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/s",function($match){
            return $this->addquote('<?php echo '.$match[1].';?>');
        },$str);



        $str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>", $str );

        /*特定规则*/
        $str = preg_replace ( "/\{(md::)([a-zA-Z0-9-_\[\]\'\"\$:]+)\}/s", "<?php echo \\1\\2;?>", $str );
        $str = preg_replace ( "/\{(rurl::)([a-zA-Z0-9-_\[\]\'\"\$:]+)\}/s", "<?php echo \\1\\2;?>", $str );


        $str = "" . $str;
        return $str;
    }


    /**
     * 转义 // 为 /
     *
     * @param $var	转义的字符
     * @return 转义后的字符
     */
    public function addquote($var) {
        return str_replace ( "\\\"", "\"", preg_replace ( "/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var ) );
    }
    

    /**
     * PC标签结束
     */
    static private function end_pc_tag() {
        return '';
    }

    /**
     * 转换数据为HTML代码
     * @param array $data 数组
     */
    private static function arr_to_html($data) {
        if (is_array($data)) {
            $str = 'array(';
            foreach ($data as $key=>$val) {
                if (is_array($val)) {
                    $str .= "'$key'=>".self::arr_to_html($val).",";
                } else {
                    if (strpos($val, '$')===0) {
                        $str .= "'$key'=>$val,";
                    } else {
                        $str .= "'$key'=>'".new_addslashes($val)."',";
                    }
                }
            }
            return $str.')';
        }
        return false;
    }
}
?>